package com.fusuhai.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

public class JWTUtil {
    /**
     * 创建
     *
     * @return JWT字符串
     */
    public String createToken(Map<String, String> map) {
        //创建过期时间
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, 5);
        //创建JWT -- 使用   JWT.create()
        //此时 builder 对象中 默认设置了 header--标头  默认为JWT
        JWTCreator.Builder builder = JWT.create();
        //将我们的信息写入有效载荷中  payload中
        for (String key : map.keySet()) {
            //通过 withClaim方法传入输入到payload中
            builder.withClaim(key, map.get(key));
        }
        //利用builder创建token
        //withExpiresAt 设置过期时间
        String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256("fusuhai"));
        return token;
    }


    /**
     * 根据token和键解码信息
     *
     * @param token token
     * @param key   键
     * @return 对应的值
     */
    public String verify(String token, String key) {
        //创建解码对象
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("fusuhai")).build();
        //包含了JWT的解码信息
        DecodedJWT decodedJWT = jwtVerifier.verify(token);
        //利用键得到存放在有效负载 payload中的数据
        String value = decodedJWT.getClaim(key).asString();

        return value;
    }


    public static void main(String[] args) {
        JWTUtil jwtUtil = new JWTUtil();
        Map map = new HashMap();
        map.put("userName", "fusuhai");
        map.put("userPwd", "123123");
        map.put("userId", "10");
        System.out.println(jwtUtil.createToken(map));
        /*
        JWT字符串格式
        XXXXXXXXXXXXXXXX.YYYYYYYYYYYYYYYYYYYY.ZZZZZZZZZZZ
        标头               信息                  签名
         */
        String token = jwtUtil.createToken(map);
        String value = jwtUtil.verify(token, "userPwd");
        System.out.println(value);
    }
}
